package cn.example.util.toolkit;

import cn.example.util.ToolFactory;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;

/**
 * 字符串操作类
 * Created by Lvgs on 2017/6/21.
 */
public class StringUtil {

    private static final Logger log = LoggerFactory.getLogger(StringUtil.class);
    /**
     * 格式化-取整数
     */
    public static final String FORMAT_Integer = "0";
    /**
     * 数字格式化-取两位小数
     */
    public static final String FORMAT_Decimal = "0.00";
    /**
     * 数字格式化-百分比（两位小数）
     */
    public static final String FORMAT_Percent = "0.00%";
    /**
     * 数字格式化-千分比（两位小数）
     */
    public static final String FORMAT_Permillage = "0.00\u2030";
    /**
     * 数字格式化-千分位（两位小数）
     */
    public static final String FORMAT_Thousands = ",##0.00";
    /**
     * 正则：数字
     */
    private static final String PATTERN_Decimal = "^(\\-?)\\d+(\\.\\d+)?$";

    private static class SingletonHolder {
        private static final StringUtil INSTANCE = new StringUtil();
    }

    private StringUtil() {
    }

    public static StringUtil getInstance() {
        return StringUtil.SingletonHolder.INSTANCE;
    }

    /**
     * 字符串分割并移除空项
     *
     * @param src   源字符串
     * @param split 分隔符
     * @return List<String>
     */
    public List<String> split(String src, String split) {
        List<String> list = new ArrayList<>();
        if (!ToolFactory.getNullUtil().isNull(src)) {
            String[] arry = src.split(split);
            for (String str : arry) {
                if (str == null || str.trim().isEmpty()) {
                    continue;
                }
                list.add(str);
            }
        }
        return list;
    }

    /**
     * 将数字前补零，补后的总长度为指定的长度，以字符串的形式返回
     *
     * @param sourceNum    原始数字
     * @param formatLength 补零后数字
     * @return 重组后的数据
     */
    public String numFormat(int sourceNum, int formatLength) {
        if (formatLength != 0) {
            return String.format("%0" + Math.abs(formatLength) + "d", Math.abs(sourceNum));
        }
        return numFormat(Math.abs(sourceNum), 1);
    }

    /**
     * 字符串填入参数
     *
     * @param source 原字符串
     * @param strs   参数
     * @return String
     */
    public String strFormat(String source, Object... strs) {
        for (int i = 0; i < strs.length; i++) {
            String temp = strs[i] != null ? strs[i].toString() : "";
            source = source.replace("{" + i + "}", temp);
        }
        return source;
    }

    /**
     * 数字转百分比
     *
     * @param number 数字
     * @param digit  小数位数
     * @return String
     */
    public String num2Percent(double number, int digit) {
        NumberFormat nf = NumberFormat.getPercentInstance();
        nf.setMinimumFractionDigits(Math.abs(digit));
        return nf.format(number);
    }

    /**
     * 获取UUID
     *
     * @return String
     */
    public String getUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 删除字符串最后一位字符
     *
     * @param src 原字符串
     * @return String
     */
    public String subStrEnd(String src) {
        if (!ToolFactory.getNullUtil().isNull(src)) {
            return src.substring(0, src.length() - 1);
        }
        return "";
    }

    /**
     * 数字格式化
     *
     * @param num    数字
     * @param format 格式
     * @return String
     */
    public String decimalFormat(Number num, String format) {
        num = ToolFactory.getBeanUtil().getNonNullBean(num, 0);
        format = ToolFactory.getBeanUtil().getNonNullBean(format, "");
        return new DecimalFormat(format).format(num);
    }

    /**
     * 字符串是否为数字
     *
     * @param str 字符串
     * @return boolean
     */
    public boolean isNum(String str) {
        return match(str, PATTERN_Decimal);
    }

    /**
     * 正则表达式匹配
     *
     * @param str     匹配字符串
     * @param pattern 正则表达式
     * @return boolean
     */
    public boolean match(String str, String pattern) {
        return !ToolFactory.getNullUtil().isNull(str) && Pattern.compile(pattern).matcher(str).matches();
    }

}
